package org.aileen.java_chatroom.api;

import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.aileen.java_chatroom.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 *
 * 实现将数据库MessageSessionMapper获取到的数据的一系列操作集成在一起->返回给客户端
 * 通过循环遍历将session作为元素放到List里面作为元素,从而构成json对象返回给前端用户
 */

@RestController
public class MessageSessionAPI {
    @Resource
    private MessageSessionMapper messageSessionMapper;

    @Resource
    private MessageMapper messageMapper;

    @GetMapping("/sessionList")
    @ResponseBody//表示返回的是数据而非页面
    public Object getMessageSessionList(HttpServletRequest req){
        //创建一个空列表,专门用于存储session
        List<MessageSession> messageSessionList = new ArrayList<>();


        //1.获取到当前用户的userId -> 从Spring 的session中获取
        //***********参数校验*********
        HttpSession session = req.getSession(false);
        if(session == null){
            System.out.println("[getMessageSessionList] session == null");
            return messageSessionList;
        }

        User user = (User) session.getAttribute("user");
        if(user == null){
            System.out.println("[getMessageSessionList] user == null");
            return messageSessionList;
        }

        //2.根据 userId 查询数据库,查出来有哪些会话id
        List<Integer> sessionIdList = messageSessionMapper.getSessionIdByUserId(user.getUserId());
        for (int sessionId : sessionIdList){
            MessageSession messageSession = new MessageSession();
            messageSession.setSessionId(sessionId);
            //3.遍历会话id , 查询出每个会话里涉及到的好友都有谁
            List<Friend> friends = messageSessionMapper.getFriendsBySessionId(sessionId , user.getUserId());
            messageSession.setFriends(friends);

            //4.遍历会话 id , 查询出每个会话的最后一条消息 TODO(需等后面创建好消息表,才能实现)
            String lastMessage = messageMapper.getLastMessageBySessionId(sessionId);
            if (lastMessage == null){
                messageSession.setLastMessage("");
            }else{
                messageSession.setLastMessage(lastMessage);
            }
            messageSessionList.add(messageSession);
        }
        // 最后目标 : 构造出一个 MessageSession 对象的数组 -> 后端就能将数据以json格式返回给前端
        return messageSessionList;
    }

    @PostMapping("/session")   //↓参数一个是消息接受者,↓  一个是消息发送者(从HTTP请求中获取User对象的userId)
    @ResponseBody
    @Transactional
    public Object addMessageSession(int toUserId, @SessionAttribute("user")User user){
        HashMap<String,Integer> resp = new HashMap<>();
        // 进行数据库的插入操作
        // 1.先给 message_session 表里插入记录. 使用这个参数的目的:为了能够获取到会话的 sessionId
        //  也就是说: MessageSession 里面的 的friends 和 lastMessage属性此处我们都用不上
        //--创建会话操作:
        MessageSession messageSession = new MessageSession();
        messageSessionMapper.addMessageSession(messageSession);

        //--插入会话用户操作:
        // 2.给 message_session_user 表插入记录
        MessageSessionUserItem item1 = new MessageSessionUserItem();
        item1.setSessionId(messageSession.getSessionId());
        item1.setUserId(user.getUserId()); // 这个会话对象是自己
        messageSessionMapper.addMessageSessionUser(item1);

        // 3.给 message_session_user 表插入记录
        MessageSessionUserItem item2 = new MessageSessionUserItem();
        item2.setSessionId(messageSession.getSessionId());
        item2.setUserId(toUserId); // 这个会话对象是对话的好友
        messageSessionMapper.addMessageSessionUser(item2);

        System.out.println("[addMessageSession] 新增会话成功! sessionId=" + messageSession.getSessionId()
                + " userId1=" + user.getUserId() + " userId2=" + toUserId);

        resp.put("sessionId", messageSession.getSessionId());
        // 返回的对象是一个普通对象也可以, 或者是一个 Map 也可以, jackson 都能进行处理.
        return resp;

    }
}
